// 引入axios
import axios from 'axios'
import store from '../store'

const Axios = axios.create({
  timeout: 5000,
  baseURL: '/apis'
})

Axios.interceptors.request.use(function (config) {
  console.log(config)
  let token = store.getters['common/getToken']
  // let token = 'dsfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'

  let otherPath = ['/user/app/code', '/user/app/login']

  // 如果请求地址包含在排除地址中，那么这个请求就不需要拦截
  if (otherPath.includes(config.url)) {
    return config
  } else {

    if (!token) {
      return Promise.reject({
        code: 400,
        message: '当前用户没有登录，所以不能发出异步请求'
      })
    } else {
      // 可以对config数据进行加工，添加上token数据
      config.headers.token = token
      // 直接发出请求
      return config
    }
  }
})

Axios.interceptors.response.use(function (response) {
  if (response.data.code === 403) {
    return Promise.reject('用户的token错误或已失效，需要用户重新登录获取新的token')
  } else {
    // 正常的业务直接返回对象
    return response
  }
})

// 封装一个ajax请求方法
function ajaxFunc(req) {

  // 如果url地址没有传递，直接报错 -- JS是主线程运行应用，所以可以使用异常抛出中断当前的线程
  if (!req.url) {
    throw new SyntaxError('请求的url参数是必传的')
  }

  return new Promise(resolve => {

    // 把动态数据 url、method、params、data 抽取出来
    // 应该用封装后的一个请求实例对象
    // axios.request({
    Axios.request({
      // 设置请求地址
      url: req.url,
      method: req.method || 'GET',
      // 是请求的基础地址
      // baseURL: 'http://www.shuiyue.info:12600',
      // 所有的请求都加上一个/apis，然后服务器会把它进行一个代理
      // baseURL: '/apis', // 这个请求地址长什么样子？http://localhost:16666/apis/user/app/code
      // 请求头
      // headers: {token: 'test token'},
      // 超时配置 -- 设置请求的最大时长
      // timeout: 5000,
      // params参数配置 -- 它的参数会自动拼接到url地址上
      params: req.params || {},
      // data参数 -- 不能再get请求中使用，它是请求体参数
      data: req.data || {}
      // }).then(data => {
      // 请求返回的是一个response对象，希望得到数据
      // console.log(data.data)
    }).then(({
      data
    }) => {
      resolve(data)
    }).catch(e => {
      console.log('----------------- 请求失败')
      resolve(e)
    })
  })

}

export default ajaxFunc
